package com.principles.behavior.state;

/**
 * @Description 状态模式————允许一个对象在其内部状态改变时，改变他的行为，对象看起来似乎修改了他的类。======》》阿里规范：表达异常的分支时，少用if-else可以使用 if--return 或 策略模式 或 状态模式
 *        别名（状态对象），状态模式是一种对象行为型模式。
 *        优点：封装了转化规则，并枚举了可能的状态，将所有于某个对状态有关的行为，放到了状态类中，并且可以方便的增加新的状态，还可以多个环境对象共享一个状态对象，从而减少系统中对象的个数
 *        缺点：使用状态模式会增加系统（状态）类和（状态）对象的个数，如果使用不当会导致程序结构或代码的混乱
 *
 *        状态模式适用于对象状态的动态变化，强调的是行为随着状态变化而变化。
 * @Date 2025/1/27 21:04
 **/
// 测试代码
public class StatePattern {
    public static void main(String[] args) {
        ElevatorContext elevator = new ElevatorContext();

        // 设置电梯为上升状态
        elevator.setState(new MovingUpState());
        elevator.request();

        // 设置电梯为静止状态
        elevator.setState(new IdleState());
        elevator.request();

        // 设置电梯为下降状态
        elevator.setState(new MovingDownState());
        elevator.request();
    }
}
// 定义电梯状态接口
interface ElevatorState {
    void handle();
}

// 具体状态：上升
class MovingUpState implements ElevatorState {
    @Override
    public void handle() {
        System.out.println("电梯正在上升...");
    }
}

// 具体状态：下降
class MovingDownState implements ElevatorState {
    @Override
    public void handle() {
        System.out.println("电梯正在下降...");
    }
}

// 具体状态：静止
class IdleState implements ElevatorState {
    @Override
    public void handle() {
        System.out.println("电梯静止在当前楼层...");
    }
}

// 上下文类：电梯
class ElevatorContext {
    private ElevatorState state;

    // 设置电梯状态
    public void setState(ElevatorState state) {
        this.state = state;
    }

    // 执行当前状态的行为
    public void request() {
        if (state == null) {
            throw new IllegalStateException("未设置电梯状态！");
        }
        state.handle();
    }
}



